#!/usr/bin/env python
# coding: utf-8

# # 本周代码练习内容——高德API

# In[75]:


# 准备工作
import requests,json
import pandas as pd
kki_key = "9b7a87e210d4d4f30a829eea855a890e"


# ## [地理/逆地理编码](https://lbs.amap.com/api/webservice/guide/api/georegeo)
# 
# 1. 地理编码：将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。
# 2. 逆地理编码：将经纬度转换为详细结构化的地址，且返回附近周边的POI、AOI信息。
# 
# 
# - 地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口，提供结构化地址与经纬度之间的相互转化的能力。
# - 结构化地址的定义： 首先，地址肯定是一串字符，内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意：针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略，但省、市、城镇等级别的地址构成是不能忽略的。暂时不支持返回台湾省的详细地址信息。

# ###  地理编码

# In[2]:


#  地理编码函数
def geocode(key, address,city=None,batch=None,sig=None,output=None,callback=None):
    """高德API地理编码获取
    （address 是需要获取坐标的结构化地址，output（XML）用于指定返回数据的格式，
      Key是用户请求数据的身份标识，具体请查看：https://lbs.amap.com/api/webservice/guide/api/georegeo ）"""
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    params = {
        "key":key,
        "address":address,
        "city":city,
        "batch":batch,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(url, params=params)
    results = r.json()['geocodes'][0]['location'] # 返回值
    return results


# In[3]:


# 准备起始点和终点
start = "广东省广州市中山大学南方学院"
stop = "广东省广州市天河城"


# In[4]:


起始点 = geocode(kki_key, start)
起始点


# In[5]:


终点 = geocode(kki_key, stop)
终点


# ###  逆地理编码

# In[73]:


# 逆地理编码函数
def regeocode(key,location,extensions="base",radius=None,poitype=None,batch=None,
              sig=None,output=None,callback=None,roadlevel=None,homeorcorp=None):
    """高德API逆地理编码获取
    （location是所需要转换的坐标点经纬度，radius（1000）为返回的附近POI的范围，
      单位：米，extensions(all)为返回的数据内容，output（XML）用于指定返回数据的格式，
      Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/georegeo ）"""
    url = "https://restapi.amap.com/v3/geocode/regeo?parameters"
    params = {
        "key":key,
        "location":location,
        "extensions":extensions,
        "radius":radius,
        "poitype":poitype,
        "batch":batch,
        "sig":sig,
        "output":output,
        "callback":callback,
        "roadlevel":roadlevel,
        "homeorcorp":homeorcorp
    }
    r = requests.get(url,params)
    results = r.json()
    return results


# In[74]:


r = regeocode(kki_key,起始点,'all')
r


# In[75]:


#  取出路
_road = []
for item in r['regeocode']['roads']:
    _road.append(item['name'])
_road


# In[76]:


pd.json_normalize(r['regeocode']['pois'])


# ## 路径规划
# - 路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口，返回JSON 或 XML格式的查询数据，用于实现路径规划功能的开发。
# - 无需展现地图的场景下，进行线路查询，如以线路结果页形式展现换乘方案；
# - 根据返回线路数据，自行开发线路导航

# ###  步行路径规划

# In[77]:


#  路径规划   -龙岗
#  步行路径规划
def walking(key,origin,destination,sig=None,output=None,callback=None):
    """高德API 步行路径规划
    （origin,destination是所需要转换的坐标点经纬度，output（XML）用于指定返回数据的格式，
      Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#walk ）"""
    url = "https://restapi.amap.com/v3/direction/walking?parameters"
    params = {'key':key, 
              'origin':origin, 
              'destination':destination,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(url, params=params)
    results = r.json()
    return results


# In[78]:


r = walking(kki_key,起始点,终点)
r


# In[79]:


r['route']['paths']


# ###  公交路径规划

# In[85]:


#  公交路径规划  天河城
def bus(key,origin,destination,city,cityd=None,extensions='base',strategy=None,
        nightflag=None,date=None,time=None,sig=None,output=None,callback=None):
    """高德API 公交路径规划
    （origin,destination是所需要转换的坐标点经纬度，output（XML）用于指定返回数据的格式，
      Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#bus）"""
    bus_url = "https://restapi.amap.com/v3/direction/transit/integrated?parameters"
    params ={
        "key":key,
        "origin":origin,
        "destination":destination,
        "city":city,
        "cityd":cityd,
        "extensions":extensions,
        "strategy":strategy,
        "nightflag":nightflag,
        "date":date,
        "time":time,
        "sig":sig,
        "output":output,
        "callback":callback
    }
    r = requests.get(bus_url,params=params)
    result = r.json()
    return result


# In[86]:


bus(kki_key,起始点,终点,"广州")


# In[87]:


pd.json_normalize(bus(kki_key,起始点,终点,"广州")['route']['transits'])


# ###  驾车路径规划

# In[90]:


#  驾车路径规划
def driving(key,origin,destination,originid=None,destinationid=None,origintype=None,destinationtype=None,
            strategy=None,waypoints=None,avoidpolygons=None,avoidroad=None,province=None,number=None,cartype=0,
            ferry=0,roadaggregation='false',nosteps=0,extensions='base',sig=None,output=None,callback=None):
    """高德API 驾车路径规划
    （origin,destination是所需要转换的坐标点经纬度，output（XML）用于指定返回数据的格式，
      Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#driving）"""
    driving_url = 'https://restapi.amap.com/v3/direction/driving?parameters'
    params = {'key':key, 
              'origin':origin, 
              'destination':destination,
              'sig':sig,
              'output':output,
              'callback':callback,
              'originid':originid,
              'destinationid':destinationid,
              'origintype':origintype,
              'destinationtype':destinationtype,
              'strategy':strategy,
              'waypoints':waypoints,
              'avoidpolygons':avoidpolygons,
              'avoidroad':avoidroad,
              'province':province,
              'number':number,
              'cartype':cartype,
              'ferry':ferry,
              'roadaggregation':roadaggregation,
              'nosteps':nosteps,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(driving_url,params=params)
    results = r.json()
    return results


# In[91]:


driving(kki_key,起始点,终点)


# ###  骑行路径规划

# In[92]:


#  骑行路径规划
def bicycling(key,origin,destination):
    """高德API 骑行路径规划
    （origin,destination是所需要转换的坐标点经纬度，Key 是高德Web服务 Key。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#t8）"""
    bicycling_url = 'https://restapi.amap.com/v4/direction/bicycling?parameters'
    params = {'key':key,
              'origin':origin,
              'destination':destination
    }
    r = requests.get(bicycling_url,params=params)
    results = r.json()
    return results


# In[103]:


bicycling(kki_key,起始点,终点)


# ###  货车路径规划

# In[11]:


#  货车路径规划
def truck(key,origin,destination,size,originid=None,destinationid=None,origintype=None,destinationtype=None,
          diu=None,strategy=None,waypoints=None,height=1.6,width=2.5,load=10,weight=0.9,axis=2,avoidpolygons=None,
          province=None,number=None,cartype=0,showpolyline=1,nosteps=0):
    """高德API 货车路径规划
    （origin,destination是所需要转换的坐标点经纬度，output（XML）用于指定返回数据的格式，
      Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#t9）"""
    truck_url = 'https://restapi.amap.com/v4/direction/truck?parameters'
    params = {'key':key, 
              'origin':origin, 
              'destination':destination,
              'size':size,
              'originid':originid,
              'destinationid':destinationid,
              'origintype':origintype,
              'destinationtype':destinationtype,
              'diu':diu,
              'strategy':strategy,
              'waypoints':waypoints,
              'height':height,
              'width':width,
              'load':load,
              'weight':weight,
              'axis':axis,
              'avoidpolygons':avoidpolygons,
              'province':province,
              'number':number,
              'cartype':cartype,
              'showpolyline':showpolyline,
              'nosteps':nosteps
    }
    r = requests.get(truck_url,params=params)
    results = r.json()
    return results


# In[12]:


truck(kki_key,起始点,终点,2)


# ###  物流距离测量矩阵（收费接口）

# In[ ]:


#  物流距离测量矩阵（收费接口）
def measure_matrix(key,ID,origin,destinations,strategy=10,restriction=0,commuteMode=1,vehicle=None):
    """高德API 物流距离测量矩阵
    （origin,destination是所需要转换的坐标点经纬度，Key 是高德Web服务 Key。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#t10）"""
    measure_matrix_url = 'https://tsapi.amap.com/v1/logistics/route/matrix'
    params = {'key':key,
              'ID':ID,
              'origin':origin,
              'destinations':destinations,
              'strategy':strategy,
              'restriction':restriction,
              'commuteMode':commuteMode,
              'vehicle':vehicle
    }
    r = requests.post(measure_matrix_url,params=params)
    results = r.json()
    return results


# ###  物流长途距离计算矩阵(收费接口)

# ###  距离测量

# In[120]:


#  距离测量
def distance(key,origins,destination,type=1,sig=None,output=None,callback=None):
    """高德API 距离测量
    （origins,destination是所需要转换的坐标点经纬度，Key 是高德Web服务 Key。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/direction#distance）"""
    distance_url = 'https://restapi.amap.com/v3/distance?parameters'
    params = {'key':key,
              'origins':origins,
              'destination':destination,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(distance_url,params=params)
    results = r.json()
    return results


# In[121]:


distance(kki_key,起始点,终点)


# ## 行政区域查询
# - 行政区域查询是一类简单的HTTP接口，根据用户输入的搜索条件可以帮助用户快速的查找特定的行政区域信息。
# - 用户希望通过得到行政区域信息，进行开发工作。

# In[122]:


#  行政区域查询
def district(key,keywords=None,subdistrict=1,page=1,offset=20,extensions='base',filter=None,output=None,callback=None):
    """高德API 行政区域查询
    （Key 是高德Web服务 Key。具体请查看：https://lbs.amap.com/api/webservice/guide/api/district）"""
    district_url = 'https://restapi.amap.com/v3/config/district?parameters'
    params = {'key':key,
              'keywords':keywords,
              'subdistrict':subdistrict,
              'page':page,
              'offset':offset,
              'extensions':extensions,
              'filter':filter,
              'output':output,
              'callback':callback
    }
    r = requests.get(district_url,params=params)
    results = r.json()
    return results


# In[123]:


district(kki_key,"深圳市")


# ## 搜索POI
# - 搜索服务API是一类简单的HTTP接口，提供多种查询POI信息的能力，其中包括关键字搜索、周边搜索、多边形搜索、ID查询四种筛选机制。
# - 关键字搜索：通过用POI的关键字进行条件搜索，例如：肯德基、朝阳公园等；同时支持设置POI类型搜索，例如：银行
# - 周边搜索：在用户传入经纬度坐标点附近，在设定的范围内，按照关键字或POI类型搜索；
# - 多边形搜索：在多边形区域内进行搜索
# - ID查询：通过POI ID，查询某个POI详情，建议可同输入提示API配合使用

# ###  关键字搜索

# In[130]:


#  搜索POI  
#  关键字搜索
def text(key,keywords=None,types=None,city=None,citylimit='false',children=0,
         page=1,offset=20,extensions='base',sig=None,output=None,callback=None):
    """高德API 关键字搜索
    （keywords(北京大学)是需要查询的关键词，city（beijing）是查询的城市范围，offset(20)为每页返回的POI数量，
      page(1)为当前页数，extensions(all)为返回信息控制参数，output（XML）用于指定返回数据的格式，
      key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/search#text）"""
    text_url = 'https://restapi.amap.com/v3/place/text?parameters'
    params = {'key':key,
              'keywords':keywords,
              'types':types,
              'city':city,
              'citylimit':citylimit,
              'children':children,
              'page':page,
              'offset':offset,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(text_url,params=params)
    results = r.json()
    return results


# In[131]:


text(kki_key,"洗手间")


# ###  周边搜索

# In[132]:


#  周边搜索
def around(key,location,keywords=None,types=None,city=None,radius=3000,sortrule=distance,
           page=1,offset=20,extensions='base',sig=None,output=None,callback=None):
    """高德API 关键字搜索
    （location(116.481488,39.990464)是需要查询的中心点，types(050301)为搜索的返回POI数据类型，
      extensions(all)为返回的数据内容，output（XML）用于指定返回数据的格式，key是用户请求数据的身份标识。
      参数。具体请查看：https://lbs.amap.com/api/webservice/guide/api/search#around）"""
    around_url = 'https://restapi.amap.com/v3/place/around?parameters'
    params = {'key':key,
              'location':location,
              'keywords':keywords,
              'types':types,
              'city':city,
              'radius':radius,
              'sortrule':sortrule,
              'page':page,
              'offset':offset,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(around_url,params=params)
    results = r.json()
    return results


# In[135]:


around(kki_key,起始点)


# ###  多边形搜索

# In[136]:


#  多边形搜索
def polygon(key,polygon,keywords=None,types=None,page=1,
            offset=20,extensions='base',sig=None,output=None,callback=None):
    """高德API 关键字搜索
    （polygon是查询的区域范围，keywords(kfc)为查询的关键字，extensions(all)为返回的数据内容，
      output（XML）用于指定返回数据的格式，key是用户请求数据的身份标识。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/search#polygon）"""
    polygon_url = 'https://restapi.amap.com/v3/place/polygon?parameters'
    params = {'key':key,
              'keywords':keywords,
              'types':types,
              'polygon':polygon,
              'page':page,
              'offset':offset,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(polygon_url,params=params)
    results = r.json()
    return results


# In[137]:


polygon(kki_key,"116.460988,40.006919|116.48231,40.007381;116.47516,39.99713|116.472596,39.985227|116.45669,39.984989|116.460988,40.006919")


# ###  ID查询

# In[72]:


#  ID查询
def id(key,id,sig=None,output=None,callback=None):
    """高德API 关键字搜索
    （ID是查询POI ID，extensions(all)为返回的数据内容，output（XML）用于指定返回数据的格式，
      key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/search#id）"""
    id_url = 'https://restapi.amap.com/v3/place/detail?parameters'
    params = {'key':key,
              'id':id,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(id_url,params=params)
    results = r.json()
    return results


# In[73]:


id(kki_key,"B0FFFAB6J2")


# ## IP定位
# - IP定位是一个简单的HTTP接口，根据用户输入的IP地址，能够快速的帮用户定位IP的所在位置。
# - 能够将IP信息转换为地理位置信息。

# In[143]:


#  IP定位
def ip(key,ip=None,sig=None,output=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/ipconfig）"""
    ip_url = 'https://restapi.amap.com/v3/ip?parameters'
    params = {'key':key,
              'ip':ip,
              'sig':sig,
              'output':output
    }
    r = requests.get(ip_url,params=params)
    results = r.json()
    return results


# In[144]:


ip(kki_key)


# ##  批量请求接口
# (受产品策略调整影响，自2020年11月起，建议您不再使用此批量接口。后续平台会逐步废弃并下线此服务。)

# ##  静态地图
# - 静态地图服务通过返回一张地图图片响应HTTP请求，使用户能够将高德地图以图片形式嵌入自己的网页中。用户可以指定请求的地图位置、图片大小、以及在地图上添加覆盖物，如标签、标注、折线、多边形。

# In[69]:


from PIL import Image
from io import BytesIO
import requests,json


# In[70]:


#  静态地图

def staticmap(key,zoom,location,size=None,scale=1,markers=None,labels=None,paths=None,traffic=0,sig=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。如果有标注/标签/折线等覆盖物，则中心点（location）和地图级别（zoom）可选填。
      当请求中无location值时，地图区域以包含请求中所有的标注/标签/折线的几何中心为中心点；如请求中无zoom，
      地图区域以包含请求中所有的标注/标签/折线为准，系统计算出zoom值。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/staticmaps）"""
    staticmap_url = 'https://restapi.amap.com/v3/staticmap?parameters'
    params = {'key':key,
              'zoom':zoom,
              'location':location,
              'size':size,
              'scale':scale,
              'markers':markers,
              'labels':labels,
              'paths':paths,
              'traffic':traffic,
              'sig':sig
    }
    response = requests.get(staticmap_url, params=params)
    data = Image.open(BytesIO(response.content))
    return data


# In[71]:


staticmap(kki_key,10,'113.679287,23.632575')


# ##  坐标转换
# - 坐标转换是一类简单的HTTP接口，能够将用户输入的非高德坐标（GPS坐标、mapbar坐标、baidu坐标）转换成高德坐标。

# In[146]:


#  坐标转换
def coordinate(key,locations,coordsys='autonavi',sig=None,output=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/convert）"""
    coordinate_url = 'https://restapi.amap.com/v3/assistant/coordinate/convert?parameters'
    params = {'key':key,
              'locations':locations,
              'coordsys':coordsys,
              'sig':sig,
              'output':output
    }
    r = requests.get(coordinate_url,params=params)
    results = r.json()
    return results


# In[148]:


coordinate(kki_key,起始点)


# ##  天气查询
# - 天气查询是一个简单的HTTP接口，根据用户输入的adcode，查询目标区域当前/未来的天气情况。

# In[149]:


#  天气查询
def weather(key,city,extensions='base',output=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/weatherinfo#weatherinfo）"""
    weather_url = 'https://restapi.amap.com/v3/weather/weatherInfo?parameters'
    params = {'key':key,
              'city':city,
              'extensions':extensions,
              'output':output
    }
    r = requests.get(weather_url,params=params)
    results = r.json()
    return results


# In[150]:


weather(kki_key,"深圳")


# ##  输入提示
# - 输入提示是一类简单的HTTP接口，提供根据用户输入的关键词查询返回建议列表。

# In[151]:


#  输入提示
def inputtips(key,keywords,location=None,type=None,city=None,
              citylimit=None,datatype='all',sig=None,output=None,callback=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/inputtips#inputtips）"""
    inputtips_url = 'https://restapi.amap.com/v3/assistant/inputtips?parameters'
    params = {'key':key,
              'keywords':keywords,
              'location':location,
              'type':type,
              'city':city,
              'citylimit':citylimit,
              'datatype':datatype,
              'sig':sig,
              'output':output,
              'callback':callback
    }
    r = requests.get(inputtips_url,params=params)
    results = r.json()
    return results


# In[152]:


inputtips(kki_key,"海底捞")


# ##  交通态势（交通态势接口计划将于2020年12月31日下线，目前不再对新用户开放。）
# - 交通态势是一类简单的HTTP接口，提供根据用户输入的内容能够返回希望查询的交通态势情况。
# - 目前支持城市：北京，上海，广州，深圳，宁波，武汉，重庆，成都，沈阳，南京，杭州，长春，常州，大连，东莞，福州，青岛，石家庄，天津，太原，西安，无锡，厦门，珠海，长沙，苏州，金华，佛山，济南，泉州，嘉兴，西宁，惠州，温州，中山，合肥，乌鲁木齐，台州，绍兴，昆明。

# ###  矩形区域交通态势

# In[76]:


#  交通态势 （交通态势接口计划将于2020年12月31日下线，目前不再对新用户开放。）
#  矩形区域交通态势
def rectangle(key,level=None,extensions='base',sig=None,output=None,callback=None,rectangle=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/trafficstatus#rectangle）"""
    rectangle_url = 'https://restapi.amap.com/v3/traffic/status/rectangle?parameters'
    params = {'key':key,
              'level':level,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback,
              'rectangle':rectangle
    }
    r = requests.get(rectangle_url,params=params)
    results = r.json()
    return results


# In[77]:


rectangle(kki_key)


# ###  圆形区域交通态势

# In[79]:


#  交通态势 （交通态势接口计划将于2020年12月31日下线，目前不再对新用户开放。）
#  圆形区域交通态势
def circle(key,location,level=None,extensions='base',sig=None,output=None,callback=None,radius=None):
    """高德API 关键字搜索
    （key是用户请求数据的身份标识。具体请查看：https://lbs.amap.com/api/webservice/guide/api/trafficstatus#circle）"""
    circle_url = 'https://restapi.amap.com/v3/traffic/status/circle?parameters'
    params = {'key':key,
              'location':location,
              'level':level,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback,
              'radius':radius
    }
    r = requests.get(circle_url,params=params)
    results = r.json()
    return results


# In[80]:


circle(kki_key,起始点)


# ###  指定线路交通态势

# In[83]:


#  交通态势 （交通态势接口计划将于2020年12月31日下线，目前不再对新用户开放。）
#  指定线路交通态势
def road(key,name,level=None,extensions='base',sig=None,output=None,callback=None,city=None,adcode=None):
    """高德API 关键字搜索
    （city和adcode必填一个。key是用户请求数据的身份标识。
      具体请查看：https://lbs.amap.com/api/webservice/guide/api/trafficstatus#road）"""
    road_url = 'https://restapi.amap.com/v3/traffic/status/road?parameters'
    params = {'key':key,
              'name':name,
              'level':level,
              'extensions':extensions,
              'sig':sig,
              'output':output,
              'callback':callback,
              'city':city,
              'adcode':adcode
    }
    r = requests.get(road_url,params=params)
    results = r.json()
    return results


# In[84]:


road(kki_key,'北环大道','深圳市')

